package com.hanj.myserver.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.hanj.myserver.entity.JdUser;

import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 我的工具类
 *
 * @author hanj.cn @outlook.com
 */
public class MyUtil {

    /**
     * 获取access_token
     *
     * @return access_token
     */
    public static String getWxAccessToken() {

        // 发请求并获取返回值
        String response = HttpUtil.get("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ww6f7e695a03dae684&corpsecret=JsJFXPiZUjRvSsrHL9fPXxe82NeYyPUG4MTxPv8MQmM");

        // 将返回值转为json对象
        // 读取并返回 accessToken
        return JSONUtil.parseObj(response).getStr("access_token");

    }

    /**
     * 写入文件
     *
     * @param filePath     文件地址
     * @param contents     内容
     * @param isNeedAppend 是否需要拼接内容
     */
    public static void writeToFile(String filePath, String contents, Boolean isNeedAppend) {

        // 判断文件是否存在
        if (!FileUtil.exist(filePath)) {

            // 不存在则创建文件
            FileUtil.touch(filePath);
        }

        // 获取文件对象
        FileWriter writer = new FileWriter(filePath);

        // 写入
        if (isNeedAppend) {
            writer.append(contents);
        } else {
            writer.write(contents);
        }

    }

    /**
     * 获取格式化的时间
     *
     * @return the time
     */
    public static String getDate() {

        // 设置时区
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

        // 获取格式化后的时间
        return new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒", Locale.CHINA).format(new Date());
    }

    /**
     * 获取青龙登录成功后返回的数据
     *
     * @return 响应
     */
    public static JSONObject qlLogin() {

        // 构造post请求的body
        HashMap<String, Object> map = new HashMap<>(2);
        map.put("username", Initialization.getUsername());
        map.put("password", Initialization.getPassword());

        // 拼接url
        String url = Initialization.getIp() + "/api/user/login?t=" + System.currentTimeMillis();

        // UA
        String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1";

        // 发送登录请求并获取响应
        JSONObject response = JSONUtil.parseObj(HttpRequest.post(url).header(Header.USER_AGENT, userAgent).form(map).timeout(20000).execute().body());

        // 写入文件(不需要拼接)
        MyUtil.writeToFile(Constant.LOGIN_RECORD, response.toString(), false);

        return response;
    }

    /**
     * 添加环境变量
     *
     * @param name    名称
     * @param value   内容
     * @param remarks 备注
     * @return 响应
     */
    public static JSONObject addEnv(String name, String value, String remarks, boolean isNeedLogin) {

        // 拼接url
        String url = Initialization.getIp() + "/api/envs?t=" + System.currentTimeMillis();

        // 获取authorization
        String authorization = Initialization.getAuthorization(isNeedLogin);

        // 构造body内容
        HashMap<String, String> map = new HashMap<>(3);

        map.put("name", name);
        map.put("value", value);
        map.put("remarks", remarks);

        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();

        jsonObject.putAll(map);
        jsonArray.add(jsonObject);

        //链式构建请求
        return JSONUtil.parseObj(HttpRequest.post(url).header(Header.AUTHORIZATION, authorization).timeout(20000).body(String.valueOf(jsonArray)).execute().body());
    }

    /**
     * 添加名称为JD_COOKIE的环境变量
     *
     * @param name   用户名
     * @param uid    uid
     * @param cookie cookie
     * @return 响应
     */
    public static JSONObject addCookieEnv(String name, String uid, String cookie, boolean isNeedLogin) {

        return MyUtil.addEnv("JD_COOKIE", cookie, name + "@@" + uid, isNeedLogin);
    }

    /**
     * 获取响应状态码
     *
     * @param response 响应
     * @return 状态码
     */
    public static <T> Integer getRespCode(T response) {

        if (response instanceof JSONObject) {
            return ((JSONObject) response).getInt("code");
        }
        if (response instanceof String) {
            return (JSONUtil.parseObj(response).getInt("code"));
        }
        return null;
    }

    /**
     * 获取authorization.
     *
     * @param isNeedLogin 是否需要登录
     * @return authorization
     */
    public static String getAuthorization(Boolean isNeedLogin) {

        // 如果不需要登录获取
        if (!isNeedLogin) {

            String token;
            String content = FileUtil.readString(Constant.LOGIN_RECORD, StandardCharsets.UTF_8);

            // 不需要重新登录,直接读取文件
            try {
                token = (String) JSONUtil.parseObj(content).get("data", JSONObject.class).get("token");
            } catch (Exception e) {
                return "Bearer " + MyUtil.qlLogin().get("data", JSONObject.class).get("token");

            }
            return "Bearer " + token;

        } else {
            // 需要重新登录
            return "Bearer " + MyUtil.qlLogin().get("data", JSONObject.class).get("token");

        }
    }

    /**
     * 判断string是否全为空格
     *
     * @param strings 目标str
     * @return the boolean
     */
    public static boolean strIsEmpty(String... strings) {

        for (String str : strings) {
            if (str == null || str.trim().length() == 0) {
                return true;
            }
        }
        return false;
    }

    public static boolean judgeCodeAndSendMsg(JdUser user) {

        boolean isNeedLogin = false;

        int counter = 0;

        while (counter < 3) {

            Integer code = MyUtil.getRespCode(MyUtil.addCookieEnv(user.getNickname(), user.getWxPusherId(), user.getCookie(), isNeedLogin));

            if (Constant.SUCCESS_CODE.equals(code)) {
                // 发送消息
                SendMsg.byBark("完成代挂", URLUtil.encode("[" + user.getNickname() + "]" + "成功加入到青龙"), URLUtil.encode(MyUtil.getDate()));

                // 发送wxpusher消息,添加uid到集合
                ArrayList<String> uids = new ArrayList<>();
                uids.add(user.getWxPusherId());

                // 发送
                SendMsg.byWxPusher("⭐用户[" + user.getNickname() + "]成功加入代挂⭐\n请点击此卡片查看详细信息!", "用户【" + user.getNickname() + "】成功加入代挂\n请仔细阅读以下内容:\n" + Initialization.getMsgToNewUser() + "\n\n" + MyUtil.getDate() + "\n本通知by胖虎菌", uids, false);

                return true;
            } else {
                // 发送消息
                SendMsg.byBark("代挂失败", URLUtil.encode("[" + user.getNickname() + "]" + "加入到青龙失败,响应码:" + code + ",重试中..."), URLUtil.encode(MyUtil.getDate()));
                isNeedLogin = true;
            }
            counter++;
        }
        SendMsg.byBark("代挂失败", URLUtil.encode("[" + user.getNickname() + "]" + "加入到青龙的失败次数过多,已停止尝试"), URLUtil.encode(MyUtil.getDate()));
        return false;
    }

}

